/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.myapp.struts.Solicitud;

import BD.BaseDatos;
import java.io.File;
import java.io.FileOutputStream;
import java.sql.ResultSet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;
import org.apache.struts.upload.FormFile;

/**
 *
 * @author Andreina Wilhelm
 */
public class realizarSolicitudAction extends org.apache.struts.action.Action {

    /* forward name="success" path="" */
    private static final String SUCCESS = "success";

    
    public void crearCarpeta(String filePath) {
        // Crea la carpeta si no existe
        File folder = new File(filePath);
        if (!folder.exists()) {
            folder.mkdir();
        }
    }
    

    public void crearArchivo(FormFile file, String filePath, int ID_solicitud) {
        try {
            String fileName = file.getFileName();

            // Si el nombre es vacio quiere decir que no hay ningun archivo
            if (!fileName.equals("")) 
            {
                fileName = ID_solicitud + "_" + fileName;

                File newFile = new File(filePath, fileName);

                if (!newFile.exists()) {
                    FileOutputStream fos = new FileOutputStream(newFile);
                    fos.write(file.getFileData());
                    fos.flush();
                    fos.close();
                }
            }
        } catch (Exception e) {
            System.out.println("ERROR: No se pudo crear el archivo");
        }
    }
        
    
    

    /**
     * This is the action called from the Struts framework.
     *
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @throws java.lang.Exception
     * @return
     */
    @Override
    public ActionForward execute(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        // crea instancia de BD
        BaseDatos bd = new BaseDatos();
        
        // Mensaje de exito o fracaso
        ActionMessages msj = new ActionMessages();

        // Obtengo FORM
        realizarSolicitudForm rsf = (realizarSolicitudForm) form;
        String correo = rsf.getCorreo();
        FormFile fileFoto = rsf.getDocFoto();
        FormFile fileCartaSoli = rsf.getDocCartaSolicitud();
        FormFile fileCI = rsf.getDocCedula();
        FormFile fileNotas = rsf.getDocCertifNotas();
        FormFile fileProgramas = rsf.getDocProgEstOrigen();
        FormFile fileConducta = rsf.getDocBuenaConducta();
        FormFile fileTitulo = rsf.getDocTitulo();
        FormFile filePuesto = rsf.getDocConstPuesto();
        FormFile fileTraducciones = rsf.getDocLegYTradNotas();
        FormFile fileRecibo = rsf.getDocReciboRevision();
        FormFile filePortafolio = rsf.getDocPortafolioTrab();

        try {
            // establece conexion con BD
            bd.establecerConexion();

            // Obtengo el id de esta nueva solicitud
            String query = "SELECT nextval('idSolicitud')";

            // se ejecuta query
            ResultSet rs = bd.ejecutarQuery(query);

            if (rs.next()) {
                int ID_solicitud = rs.getInt(1);              
                
                // Creo el path para guardar los archivos. Los guardos en la carpeta Sevidor\Solicitudes\, creo otra carpeta con el usuario y otra con ID de la solicitud
                String pathUser = getServlet().getServletContext().getRealPath("/Servidor/Solicitudes/" + correo);
                crearCarpeta(pathUser);

                // Y una carpeta con ID de la solicitud
                String filePath = pathUser + "\\" + ID_solicitud;
                crearCarpeta(filePath);                
               
                // Se crean todos los archivos
                crearArchivo(fileFoto, filePath, ID_solicitud);         // Creo el archivo de FOTO en la carpeta. Se concatena el numero de la solicitud  
                crearArchivo(fileCartaSoli, filePath, ID_solicitud);    // Creo el archivo de CARTA DE SOLICITUD en la carpeta    
                crearArchivo(fileCI, filePath, ID_solicitud);           // Creo el archivo de CEDULA DE IDENTIDAD en la carpeta
                crearArchivo(fileNotas, filePath, ID_solicitud);        // Creo el archivo de CERTIFICACION DE NOTAS en la carpeta
                crearArchivo(fileProgramas, filePath, ID_solicitud);    // Creo el archivo de PROGRAMAS DE ASIGNATURAS en la carpeta
                crearArchivo(fileConducta, filePath, ID_solicitud);     // Creo el archivo de CERTIFICACION DE BUENA CONDUCTA en la carpeta
                crearArchivo(fileTitulo, filePath, ID_solicitud);       // Creo el archivo de TITULO O CONSTANCIA en la carpeta
                crearArchivo(filePuesto, filePath, ID_solicitud);       // Creo el archivo de CONSTANCIA DEL PUESTO DE PROMOCION en la carpeta
                crearArchivo(fileTraducciones, filePath, ID_solicitud); // Creo el archivo de LEGALIZACIONES Y TRADUCCIONES DE NOTAS Y PROGRAMAS en la carpeta. Como no es obligatior reviso si no es null
                crearArchivo(fileRecibo, filePath, ID_solicitud);       // Creo el archivo de RECIBO POR CONCEPTO DE REVISION DE  DOCUMENTOS en la carpeta
                crearArchivo(filePortafolio, filePath, ID_solicitud);   // Creo el archivo de PORTAFOLIO DE TRABAJO en la carpeta. Como no es obligatior reviso si no es null
                
                
                // se crea el query
                String campos = "INSERT INTO solicitud (";
                String valores = "VALUES (";              

                campos += "idSolicitud, ";
                valores += "currval('idSolicitud'), ";

                campos += "correo, ";
                valores += "'"+ rsf.getCorreo() +"', ";

                campos += "nombres, ";
                valores += "'"+ rsf.getNombres()+"', ";

                campos += "apellidos, ";
                valores += "'"+ rsf.getApellidos()+"', ";

                campos += "cedula, ";
                valores += "'"+ rsf.getCedula() + "-" + rsf.getCedulaNum() + "', ";

                campos += "lugarNacimiento, ";
                valores += "'" + rsf.getLugarNacimiento() + "', ";

                campos += "paisNacimiento, ";
                valores += "'" + rsf.getPaisNacimiento()+ "', ";

                campos += "nacionalidad, ";
                valores += "'" + rsf.getNacionalidad()+ "', ";

                campos += "nacionalizado, ";
                valores += "'" + rsf.getNacionalizado()+ "', ";

                campos += "numGacetaOficial, ";
                valores += "'" + rsf.getNumGacetaOficial()+ "', ";

                campos += "fechaGacetaOficial, ";
                valores += "'" + rsf.getFechaGacetaOficial()+ "', ";

                campos += "fechaNacimiento, ";
                valores += "'" + rsf.getFechaNacimiento()+ "', ";

                campos += "edad, ";
                valores += "'" + rsf.getEdad()+ "', ";

                campos += "sexo, ";
                valores += "'" + rsf.getSexo()+ "', ";

                campos += "estadoCivil, ";
                valores += "'" + rsf.getEstadoCivil()+ "', ";

                campos += "direcHabitacion, ";
                valores += "'" + rsf.getDirecHabitacion()+ "', ";

                campos += "tlfHabitacion, ";
                valores += "'" + rsf.getTlfHabitacion()+ "', ";

                campos += "direcEnvioCorresp, ";
                valores += "'" + rsf.getDirecEnvioCorresp()+ "', ";

                campos += "tlfEnvioCorresp, ";
                valores += "'" + rsf.getTlfEnvioCorresp()+ "', ";

                campos += "direcCasosEsp, ";
                valores += "'" + rsf.getDirecCasosEsp()+ "', ";

                campos += "tlfCasosEsp, ";
                valores += "'" + rsf.getTlfCasosEsp()+ "', ";

                campos += "personaCasosEsp, ";
                valores += "'" + rsf.getPersonaCasosEsp()+ "', ";

                campos += "nexoPersonaCasosEsp, ";
                valores += "'" + rsf.getNexoPersonaCasosEsp()+ "', ";

                campos += "estudioSupInstituto, ";
                valores += "'" + rsf.getEstudioSupInstituto()+ "', ";

                campos += "estudioSupInstLugar, ";
                valores += "'" + rsf.getEstudioSupInstLugar()+ "', ";

                campos += "estudioSupInstPais, ";
                valores += "'" + rsf.getEstudioSupInstPais()+ "', ";

                campos += "estudioSupRealizado, ";
                valores += "'" + rsf.getEstudioSupRealizado()+ "', ";

                campos += "estudioSupTitulo, ";
                valores += "'" + rsf.getEstudioSupTitulo()+ "', ";

                campos += "equivSolicitada, ";
                valores += "'" + rsf.getEquivSolicitada()+ "', ";

                campos += "carreraSolicitada, ";
                if(rsf.getEquivSolicitada().equals("2"))
                {
                    valores += "'" + rsf.getCarreraSolicitadaSeleccion()+ "', ";
                }
                else
                {
                    valores += "'" + rsf.getCarreraSolicitadaText()+ "', ";
                }



                // Path documentos
                // Solo queda agregarle el nombre del archivo al PATH BASE
                String pathBase = filePath + "\\" + ID_solicitud + "_";  

                campos += "pathFoto, ";
                valores += "'" + pathBase + rsf.getDocFoto().getFileName() + "', ";

                campos += "pathCartaSolicitud, ";
                valores += "'" + pathBase + rsf.getDocCartaSolicitud().getFileName() + "', ";

                campos += "pathCedula, ";
                valores += "'" + pathBase + rsf.getDocCedula().getFileName() + "', ";

                campos += "pathCertificadoNotas, ";
                valores += "'" + pathBase + rsf.getDocCertifNotas().getFileName() + "', ";

                campos += "pathProgramaEstudios, ";
                valores += "'" + pathBase + rsf.getDocProgEstOrigen().getFileName() + "', ";

                campos += "pathBuenaConducta, ";
                valores += "'" + pathBase + rsf.getDocBuenaConducta().getFileName() + "', ";

                campos += "pathBuenaTituloObtenido, ";
                valores += "'" + pathBase + rsf.getDocTitulo().getFileName() + "', ";

                campos += "pathConstPuesto, ";
                valores += "'" + pathBase + rsf.getDocConstPuesto().getFileName() + "', ";


                // Si el nombre es vacio quiere decir que no hay ningun archivo. Este documento no es obligatorio, por lo tanto puede estar vacio
                campos += "pathLegTradNotas, ";
                if (!rsf.getDocLegYTradNotas().getFileName().equals("")) 
                {                    
                    valores += "'" + pathBase + rsf.getDocLegYTradNotas().getFileName() + "', ";
                }
                else
                {
                    valores += "'', ";
                }


                // Si el nombre es vacio quiere decir que no hay ningun archivo. Este documento no es obligatorio, por lo tanto puede estar vacio
                campos += "pathPortafolioTrabajo, ";
                if (!rsf.getDocPortafolioTrab().getFileName().equals("")) 
                {
                    valores += "'" + pathBase + rsf.getDocPortafolioTrab().getFileName() + "', ";
                }  
                else
                {
                    valores += "'', ";
                }


                campos += "pathRecibo)";
                valores += "'" + pathBase + rsf.getDocReciboRevision().getFileName() + "')";

                

                String queryInsert = campos + valores;                
                
                // se ejecuta query
                boolean result = bd.updateQuery(queryInsert);
              
                // si no hay problema con el query ejecutado
                if (result) {
                    // Se termina conexion con BD
                    bd.terminarConexion();
                
                    return mapping.findForward(SUCCESS);
                }
            }
        } catch (Exception e) {
            System.out.println("ERROR: Problema al consultar la BD");
        }

        // Se termina conexion con BD
        bd.terminarConexion();

        // mensaje de fracaso
        msj.add("err_op", new ActionMessage("errors.solicitud"));
        saveErrors(request, msj);

        return mapping.getInputForward();
    }
}
